﻿//dd当上了宣传委员，开始组织迎新晚会，已知班里有n个同学，
//每个同学有且仅有一个擅长的声部，把同学们分成恰好m组，
//为了不搞砸节目，每一组里的同学都必须擅长同一个声部，
//当然，不同组同学擅长同一个声部的情况是可以出现的，毕竟一个声部也可以分成好几个part进行表演，
//但是他不希望出现任何一组的人过多，否则可能会导致场地分配不协调，
//也就是说，她希望人数最多的小组的人尽可能少，
//除此之外，对组内人员分配没有其他要求，她希望你告诉她，这个值是多少，如果无法顺利安排，请输出 - 1
//
//
//第一行两个数个数n, m(1≤m≤n≤100000)表示人数
//接下来一行n个数, a[i](1≤a[i]≤n)表示第i个学生的擅长声部

//输出一个数，表示人数最多的小组的人数


#include <iostream>
#include <unordered_map>
using namespace std;
int n, m;
unordered_map<int, int> cnt; // 统计每种声部的⼈数
bool check(int x) // 判断最多⼈数为 x 时，能否分成 m 组
{
	int g = 0; // 能分成多少组
	for (auto& [a, b] : cnt)
	{
		g += b / x + (b % x == 0 ? 0 : 1);
	}
	return g <= m;
}
int main()
{
	cin >> n >> m;
	int hmax = 0; // 统计声部最多的⼈数
	for (int i = 0; i < n; i++)
	{
		int x;
		cin >> x;
		hmax = max(hmax, ++cnt[x]);
	}

	int kinds = cnt.size();
	if (kinds > m) // 处理边界情况
	{
		cout << -1 << endl;
	}
	else
	{
		// // 暴⼒枚举
		// for(int i = 1; i <= hmax; i++) // 枚举所有的最多⼈数
		// {
		// if(check(i))
		// {
		// cout << i << endl;
		// break;
		// }
		// }
		 // ⼆分解法
		int l = 1, r = hmax;
		while (l < r)
		{
			int mid = (l + r) / 2;
			if (check(mid)) r = mid;
			else l = mid + 1;
		}
		cout << l << endl;
	}

	return 0;
}